Amazon AppFlow 入門として Slack から S3 へデータをロードするフローを作ってみた
とりあえず AppFlow を触ってみたい
コンバンハ、千葉(幸)です。
Amazon AppFlow はコーディング不要で SaaS アプリケーションや AWS サービス間のデータ転送を実現するマネージドなインテグレーションサービスです。
今まで触ったことがなかったので、いっちょ入門してみるかということで一番とっつきやすそうな Slack → S3 のフローを作ってみることにしました。
以下に載っている内容をベースに、個人的につまずきが多かった Slack 周りの設定を厚めに取り上げていきます。
- Amazon AppFlowでSlackのメッセージをS3に保存する | DevelopersIO
- Amazon AppFlow を使用して Slack から Amazon S3 にデータをロードする
今回作成する AppFlow の構成
イメージ図はこちらです。
最終的には AppFlow でフローというリソースを作成し、フローの実行を行うことでデータの転送が行われます。
フローでは送信元と送信先を指定することになり、今回で言えばそれぞれ Slack と S3 が該当します。Slack をフローに設定するためには接続情報などを定義したコネクタプロパティ(コンソールでは「接続」と表される)の作成も必要になります。
Slack のコネクタプロパティを作成するためには Slack 側でいくつか準備が必要なため、それを先に行う手順で進めていきます。
- Slack アプリの設定
- S3 バケットの設定
- AppFlow フローの作成
- AppFlow フローの実行
1. Slack アプリの設定
今回は個人の検証用の Slack のワークスペースchibayuki
を作成し、そこでアプリの設定を行なっていきます。
アプリの作成
Slack ワークスペースから「設定と管理」→「アプリを管理する」で管理画面に遷移します。
わたしの環境ではまだアプリがインストールされていない状態です。右上の「ビルド」から`https://api.slack.com/apps/`に遷移します。
「Create an App」を押下します。
「From scratch」を押下します。
アプリ名、ワークスペースを指定し、「Create App」を押下します。
アプリが作成されたら、「Basic Information」からアプリのクレデンシャルが確認できます。以下の情報を AppFlow のコネクタプロパティ作成時に使用するため、控えておきましょう。
- Client ID
- Client Secret
OAuth & Permissions の設定
アプリの OAuth & Permissionsセクションから以下の設定を行なっていきます。
- リダイレクト URL
- ユーザートークンスコープ
リダイレクト URL
リダイレクト URL に設定する URL は以下です。
- us-east-1リージョンの場合
- `https://console.aws.amazon.com/appflow/oauth`
- それ以外のリージョンの場合
- `https://{region}.console.aws.amazon.com/appflow/oauth`
今回は AppFlow を東京リージョンで作成予定のため、`https://ap-northeast-1.console.aws.amazon.com/appflow/oauth`を設定しました。
ユーザートークンスコープ
以下ページに記載のあるスコープを設定していきます。ここで許可した内容が AppFlow で許可されることになります。
2022年11月現在では以下が該当します。
channels:history
channels:read
groups:history
groups:read
im:history
im:read
mpim:history
mpim:read
アプリのインストール
作成したアプリをワークスペースにインストールします。
確認画面で許可すればインストールの完了です。
2. S3 バケットの設定
フローで送信先として設定する S3 バケットを準備します。
とは言え特に特別な設定は必要ありません。マネジメントコンソールからフローの設定をする際には S3 バケットポリシーを自動で修正してくれるので、あらかじめ設定しておく必要もありません。
今回はChikayuki-hoge-hoge
という名称のバケットを以下設定で準備しました。
- オブジェクト所有者:ACL 無効
- ブロックパブリックアクセス:すべてブロック
- デフォルト暗号化:
SSE-S3
- バージョンニング:有効
- バケットポリシー:なし(現時点では。)
詳細な要件などはこちらをご確認ください。(送信先に設定する場合の固有の事項などもありますのでご注意ください。)
3. Appflow フローの作成
いよいよ AppFlow フローを作成していきます。後から考えると、先にコネクタプロパティを作成しておいた方が仮にエラーになった時の手戻りが少なくて済むのでおすすめです。
今回はフローの作成の中でコネクタプロパティの作成も行います。
手順1. フローの詳細を指定
AppFlow コンソールから「フローを作成」を押下します。
フロー名を指定し次に進みます。
↑デフォルトでは AWS 管理の KMS キーで暗号化されますが、カスタマー管理のキーを指定することもできます。
手順2. フローを設定【送信元】
送信元の設定に合わせてコネクタプロパティ(接続)を作成します。「送信元名」で Slack を選択し、「接続する」を押下します。
以下を入力し、「続行」を押下します。
- クライアント ID
- クライアントシークレット
- ワークスペース名
- 接続名
OAuth 認証画面に遷移するため、「許可する」を押下します。
正常に接続が作成されたら、以下を選択します。
- Slack オブジェクト(現時点では
Conversations
のみ) - Slack チャンネル(ワークスペース内のチャンネル)
これで接続が作成されます。
ちなみに
接続の作成時に以下のエラーが発生した時があったのですが、これは単に入力する値を間違えていたためでした。(クライアントシークレットでなく Signing Secret を入力していた。)
Error authenticating to connector: Authentication exception from connector: Error while deserializing auth response
他にも Slack 側の設定不備でエラーが発生することがあるかと思います。上記のエラーが発生した際には改めて見直してみてください。
ちなみに 2
接続の作成時に入力した内容は AWS Secrets Manager シークレットに保存されています。
名称は以下の規則で作成されるようです。
appflow!{アカウント番号}-{接続名}-{作成時刻(UNIX時間)}
説明書きはこのような感じ。
appflow owned service linked secret created for connector profile [TestConnect] and account [012345678910]. Deleting the secret will fail execution for associated active flows.
値は以下の種類が含まれていました。
clientId
:入力したものclientSecret
:入力したものaccessToken
:OAuth 認証で取得したもの
手順2. フローを設定【送信先・フロートリガー】
続きを進めていきます。送信先として、準備した S3 バケットを選択します。細かい設定を行うこともできますが、今回はすべてデフォルトのままにします。
最後にフロートリガーを選択し次へ進むことで手順2 は終了です。
手順3. データフィールドをマッピング
データに含まれるフィールドについて、送信元と送信先でマッピングを行います。
細かく指定もできますが、「送信先フィールド名」で「すべてのフィールドを直接マッピングする」を選択しおまかせします。マッピングされたフィールドが自動的に設定されました。
↑「妥当性確認」でフィールドごとにバリデーションができますが、今回は特に指定せず次に進みます。
手順4. フィルターを追加する~手順5. 確認して作成
手順4 でフィルターを追加できます。今回のケースでは選択できるフィールドはTimestamp
のみでした。せっかくなので適当な値を追加してみました。(UNIX 時間で1111111111
はおおよそ 2005/3/18 なので、「それより大きい」はほぼ意味をなさない。)
最後のステップとして手順 5 でこれまでの設定値を確認し、「フローを作成」を押下すればフローの作成は完了です。(後から撮り直したので細部のパラメータが異なっていますが気にしないでください。)
ちなみに 3
フローの作成完了後、送信先として指定した S3 バケットのバケットポリシーを確認すると以下の値が設定されていました。
{ "Version": "2008-10-17", "Statement": [ { "Sid": "AllowAppFlowDestinationActions", "Effect": "Allow", "Principal": { "Service": "appflow.amazonaws.com" }, "Action": [ "s3:PutObject", "s3:AbortMultipartUpload", "s3:ListMultipartUploadParts", "s3:ListBucketMultipartUploads", "s3:GetBucketAcl", "s3:PutObjectAcl" ], "Resource": [ "arn:aws:s3:::chibayuki-hoge-hoge", "arn:aws:s3:::chibayuki-hoge-hoge/*" ], "Condition": { "StringEquals": { "aws:SourceAccount": "012345678910" } } } ] }
appflow.amazonaws.com
からのアクションを許可しつつ、Condition 句で AWS アカウントを限定することで権限を絞っていますね。
4. AppFlow フローの実行
準備が整ったので、いよいよ AppFlow フローを実行していきます。
コネクタプロファイルで設定した Slack チャンネルでは以下のように 3 つだけ書き込みがある状態です。
フローの画面から「フローを実行」を押下します。
画面の上部に実行結果が表示されます。今回はレコード数も少ないのであっという間に完了しました。
出力先のバケットを確認すると、以下のようなパスでオブジェクトが格納されていました。
s3://chibayuki-hoge-hoge/test-flow/ec11eeca-fdfc-48b2-80c8-231ddf6643a9/-1258851841-2022-11-07T11:25:39
オブジェクトの中身を確認するとこのような感じ。
{"blocks":[{"type":"rich_text","block_id":"IMzDL","elements":[{"type":"rich_text_section","elements":[{"type":"text","text":"テスト書き込みです"}]}]}],"client_msg_id":"9f75e39d-3c7a-4c63-9206-0fa9ad39ec58","text":"テスト書き込みです","team":"T04AFLPMR16","ts":"1667820261.475789","type":"message","user":"U04A4K1NRT3"} {"blocks":[{"type":"rich_text","block_id":"IY=R","elements":[{"type":"rich_text_section","elements":[{"type":"text","text":"テスト書き込み"}]}]}],"client_msg_id":"4def0244-af04-4e95-8dc9-e5c0a98d23ac","text":"テスト書き込み","team":"T04AFLPMR16","ts":"1667820254.200019","type":"message","user":"U04A4K1NRT3"} {"subtype":"channel_join","text":"<@U04A4K1NRT3>さんがチャンネルに参加しました","ts":"1667815968.901369","type":"message","user":"U04A4K1NRT3"}
jq で見やすくしてあげるとこのような内容になっていました。
{ "blocks": [ { "type": "rich_text", "block_id": "IMzDL", "elements": [ { "type": "rich_text_section", "elements": [ { "type": "text", "text": "テスト書き込みです" } ] } ] } ], "client_msg_id": "9f75e39d-3c7a-4c63-9206-0fa9ad39ec58", "text": "テスト書き込みです", "team": "T04AFLPMR16", "ts": "1667820261.475789", "type": "message", "user": "U04A4K1NRT3" } { "blocks": [ { "type": "rich_text", "block_id": "IY=R", "elements": [ { "type": "rich_text_section", "elements": [ { "type": "text", "text": "テスト書き込み" } ] } ] } ], "client_msg_id": "4def0244-af04-4e95-8dc9-e5c0a98d23ac", "text": "テスト書き込み", "team": "T04AFLPMR16", "ts": "1667820254.200019", "type": "message", "user": "U04A4K1NRT3" } { "subtype": "channel_join", "text": "<@U04A4K1NRT3>さんがチャンネルに参加しました", "ts": "1667815968.901369", "type": "message", "user": "U04A4K1NRT3" }
AppFlow による Slack から S3 へのデータ転送が確認できました!
終わりに
Amazon AppFlow 入門として Slack から S3 へのデータ転送を行うフローを作成してみました。フローを作成さえできればマネージドでいい感じに転送できるのはすごいですね。
AppFlow としては、作成するリソースは以下のみでシンプルではありました。
- コネクタプロパティ(接続)
- フロー
その代わり Slack 側の設定は慣れていないこともあり少し手間取ってしまいました。連携する SaaS アプリケーションによって必要となる設定は変わってくるかと思いますので、用いるアプリケーションに応じてドキュメント等をよく確認してお試しください。
AppFlow 入門を考えている方の参考になれば幸いです。
以上、 チバユキ (@batchicchi) がお送りしました。